001    /*
002     *  Copyright 2001-2005 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.time;
017    
018    /**
019     * Defines an instant in the datetime continuum.
020     * This interface expresses the datetime as milliseconds from 1970-01-01T00:00:00Z.
021     * <p>
022     * The implementation of this interface may be mutable or immutable.
023     * This interface only gives access to retrieve data, never to change it.
024     * <p>
025     * Methods in your application should be defined using <code>ReadableInstant</code>
026     * as a parameter if the method only wants to read the instant without needing to know
027     * the specific datetime fields.
028     *
029     * @author Stephen Colebourne
030     * @since 1.0
031     */
032    public interface ReadableInstant extends Comparable {
033    
034        /**
035         * Get the value as the number of milliseconds since
036         * the epoch, 1970-01-01T00:00:00Z.
037         *
038         * @return the value as milliseconds
039         */
040        long getMillis();
041    
042        /**
043         * Gets the chronology of the instant.
044         * <p>
045         * The {@link Chronology} provides conversion from the millisecond
046         * value to meaningful fields in a particular calendar system.
047         * 
048         * @return the Chronology, never null
049         */
050        Chronology getChronology();
051    
052        /**
053         * Gets the time zone of the instant from the chronology.
054         * 
055         * @return the DateTimeZone that the instant is using, never null
056         */
057        DateTimeZone getZone();
058    
059        /**
060         * Get the value of one of the fields of a datetime.
061         * <p>
062         * This method uses the chronology of the instant to obtain the value.
063         *
064         * @param type  a field type, usually obtained from DateTimeFieldType, not null
065         * @return the value of that field
066         * @throws IllegalArgumentException if the field type is null
067         */
068        int get(DateTimeFieldType type);
069    
070        /**
071         * Checks whether the field type specified is supported by this implementation.
072         *
073         * @param field  the field type to check, may be null which returns false
074         * @return true if the field is supported
075         */
076        boolean isSupported(DateTimeFieldType field);
077    
078        //-----------------------------------------------------------------------
079        /**
080         * Get the value as a simple immutable <code>Instant</code> object.
081         * <p>
082         * This can be useful if you don't trust the implementation
083         * of the interface to be well-behaved, or to get a guaranteed
084         * immutable object.
085         *
086         * @return the value as an <code>Instant</code> object
087         */
088        Instant toInstant();
089    
090        //-----------------------------------------------------------------------
091        /**
092         * Compares this object with the specified object for ascending
093         * millisecond instant order. This ordering is inconsistent with
094         * equals, as it ignores the Chronology.
095         * <p>
096         * All ReadableInstant instances are accepted.
097         *
098         * @param readableInstant  a readable instant to check against
099         * @return negative value if this is less, 0 if equal, or positive value if greater
100         * @throws NullPointerException if the object is null
101         * @throws ClassCastException if the object type is not supported
102         */
103        int compareTo(Object readableInstant);
104    
105        //-----------------------------------------------------------------------
106        /**
107         * Is this instant equal to the instant passed in
108         * comparing solely by millisecond.
109         *
110         * @param instant  an instant to check against, null means now
111         * @return true if the instant is equal to the instant passed in
112         */
113        boolean isEqual(ReadableInstant instant);
114    
115        /**
116         * Is this instant after the instant passed in
117         * comparing solely by millisecond.
118         *
119         * @param instant  an instant to check against, null means now
120         * @return true if the instant is after the instant passed in
121         */
122        boolean isAfter(ReadableInstant instant);
123    
124        /**
125         * Is this instant before the instant passed in
126         * comparing solely by millisecond.
127         *
128         * @param instant  an instant to check against, null means now
129         * @return true if the instant is before the instant passed in
130         */
131        boolean isBefore(ReadableInstant instant);
132    
133        //-----------------------------------------------------------------------
134        /**
135         * Compares this object with the specified object for equality based
136         * on the millisecond instant and the Chronology. All ReadableInstant
137         * instances are accepted.
138         * <p>
139         * To compare two instants for absolute time (ie. UTC milliseconds 
140         * ignoring the chronology), use {@link #isEqual(ReadableInstant)} or
141         * {@link #compareTo(Object)}.
142         *
143         * @param readableInstant  a readable instant to check against
144         * @return true if millisecond and chronology are equal, false if
145         *  not or the instant is null or of an incorrect type
146         */
147        boolean equals(Object readableInstant);
148    
149        /**
150         * Gets a hash code for the instant that is compatible with the 
151         * equals method.
152         * <p>
153         * The formula used must be as follows:
154         * <pre>
155         * ((int) (getMillis() ^ (getMillis() >>> 32))) +
156         * (getChronology().hashCode())
157         * </pre>
158         *
159         * @return a hash code as defined above
160         */
161        int hashCode();
162    
163        //-----------------------------------------------------------------------
164        /**
165         * Get the value as a String in a recognisable ISO8601 format.
166         * <p>
167         * The string output is in ISO8601 format to enable the String
168         * constructor to correctly parse it.
169         *
170         * @return the value as an ISO8601 string
171         */
172        String toString();
173    
174    }